﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//int factorial1(int n)
//{
//	int m = 1;
//	while (n > 0)
//	{
//		m *= n ;
//		n--;
//	}
//	return m;
//}
//int factorial2(int n)
//{
//	if (1 == n)
//	{
//		return 1;
//	}
//	else
//	{
//		return n * factorial2(n - 1);
//	}
//}
//int main()
//{
//	printf("%d ", factorial1(6));
//	printf("%d ", factorial1(6));
//	return 0;
//}

//递归方式实现打印一个整数的每一位
//void print(int num)
//{
//	if (num < 10)
//	{
//		printf(" %d", num);
//	}
//	else
//	{
//		print(num / 10);
//		printf(" %d", num % 10);
//	}
//}
//void print(int num)
//{
//	if (num > 10)
//	{ 
//		print(num / 10);
//	}
//	
//		
//		printf("%d ", num % 10);
//
//}

//1!+2!+……+10!
//int main()
//{
//	long ret = 1;
//	long long  sum = 0;
//	for (int i = 1; i <= 10; i++)
//	{
//		ret *= i;
//		printf("%ld ", ret);
//		sum += ret;
//	}
//	printf("%lld ", sum);
//	return 0;
//}

//
//int binary_search(int* arr, int num,int len)
//{
//	int left = 0;
//	int right = len - 1;
//	int mid = 0;
//	while (left <= right)
//	{
//		mid = left + (right - left) / 2;
//		if (arr[mid] > num)
//		{
//			right = mid - 1;
//		}
//		else if (arr[mid] > num)
//		{
//			left = mid + 1;
//		}
//		else
//		{
//			return mid;
//		}
//	}
//
//	return -1;
//
//}
#include<windows.h>
#include<stdlib.h>
//编写代码，演示多个字符从两端移动，向中间汇聚。
int main()
{
	char arr1[19] = "welcom to my world";
	char arr2[19] = "******************";
	
	int left = 0;
	int right = 18;
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(200);
		system("cls");
		left++;
		right--;
	}
	return 0;
}


//给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
int lengthOfLongestSubstring(char* s)
{
    //类似于hash的思想
    //滑动窗口维护
    int left = 0;
    int right = 0;
    int max = 0;
    int i, j;
    int len = strlen(s);
    int haveSameChar = 0;
    for (i = 0; i < len; i++)
    {
        if (left <= right)
        {
            //检测是否出现重复
             //循环遍历整个数组 left -> right
            haveSameChar = 0;
            for (j = left; j < right; j++)
            {
                if (s[j] == s[right])
                {
                    haveSameChar = 1;
                    break;
                }
            }
            if (haveSameChar)
            {
                //指向下一个
                left = j + 1;
            }
        }
        //统计最大的间距
        max = max < (right - left + 1) ? (right - left + 1) : max;
        right++;
    }
    return max;
}

int lengthOfLongestSubstring(char* s)
{
    //类似于hash的思想
    //因为字符ASCII的最大值为127
    int hash[127] = { 0 };
    //双指针思想 维护2个窗口
    int left = 0;
    int right = 0;
    int max = 0;

    //循环遍历整个数组
    while (s[right])
    {
        if (hash[s[right]] && left < hash[s[right]])
        {
            //右侧重复出现
            //左指针向前移动
            left = hash[s[right]];
        }
        //记录当前
        //保存如果出现重复原始时，下标指向的位置
        hash[s[right]] = right + 1;
        max = max < (right - left + 1) ? (right - left + 1) : max;
        right++;//右指针每次都要加一。
    }
    return max;
}

int lengthOfLongestSubstring(char* s)
{
    //滑动窗口

    int indexLeft = 0;
    int indexRight = 0;
    int len = strlen(s);


    int hashMap[255] = { 0 };
    int maxCount = 0;
    while (indexRight < strlen(s))
    {
        if (hashMap[s[indexRight]] != 0)
        {
            //重复出现了
            if (hashMap[s[indexRight]] > indexLeft)
                indexLeft = hashMap[s[indexRight]];
            hashMap[s[indexRight]] = indexRight + 1;
        }
        else
        {
            hashMap[s[indexRight]] = indexRight + 1;
        }
        maxCount = fmax(maxCount, indexRight - indexLeft + 1);
        indexRight++;
    }
    return maxCount;
}


